﻿//using System;
//using System.ComponentModel;
//using System.Linq;
//using System.Windows.Markup;

//using Supremacy.Data;
//using Supremacy.Game;
//using Supremacy.Orbitals;
//using Supremacy.Tech;
//using System.Globalization;
//using Supremacy.Resources;
//using Supremacy.Types;

//namespace Supremacy.Text
//{
//    [Serializable]
//    public abstract class LocalizedTextGroup : BindingList<LocalizedTextEntry>
//    {
//        protected override void InsertItem(int index, LocalizedTextEntry entry)
//        {
//            base.InsertItem(index, entry);
//            entry.OnAdded(this);
//        }

//        protected override void RemoveItem(int index)
//        {
//            LocalizedTextEntry entry = this[index];
//            entry.OnRemoved(this);
//            base.RemoveItem(index);
//        }

//        public void Commit()
//        {
//            foreach (LocalizedTextEntry entry in this)
//                entry.OnCommit(this);
//        }

//        protected override void ClearItems()
//        {
//            while (this.Count > 0)
//                RemoveItem(0);
//        }

//        public abstract LocalizedTextEntry CreateNew(CultureInfo culture);
//    }

//    [Serializable]
//    public abstract class LocalizedTextEntry : INotifyPropertyChanged, IDisposable
//    {
//        public static readonly CultureInfo NeutralCulture = CultureInfo.GetCultureInfo("en");

//        public string CultureDisplayName
//        {
//            get
//            {
//                CultureInfo culture = (this.Culture == NeutralCulture.Name)
//                    ? NeutralCulture
//                    : CultureInfo.GetCultureInfo(this.Culture);
//                if (culture != null)
//                    return culture.DisplayName;
//                return NeutralCulture.Name;
//            }
//        }

//        public string Culture
//        {
//            get { return CultureInternal; }
//            set
//            {
//                CultureInternal = value;
//                OnPropertyChanged("Culture");
//            }
//        }

//        [DependsOn("ValueInternal")]
//        public string Value
//        {
//            get { return ValueInternal; }
//            set
//            {
//                ValueInternal = value;
//                OnPropertyChanged("Value");
//            }
//        }

//        protected abstract string CultureInternal { get; set; }
//        protected abstract string ValueInternal { get; set; }

//        protected internal virtual void OnAdded(LocalizedTextGroup group) {}
//        protected internal virtual void OnRemoved(LocalizedTextGroup group) {}
//        protected internal virtual void OnCommit(LocalizedTextGroup group) {}
//        protected internal virtual void OnDisposed() {}

//        #region INotifyPropertyChanged Members
//        public event PropertyChangedEventHandler PropertyChanged;

//        protected void OnPropertyChanged(string propertyName)
//        {
//            if (PropertyChanged != null)
//                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
//        }
//        #endregion

//        #region IDisposable Members
//        public void Dispose()
//        {
//            OnDisposed();
//        }
//        #endregion
//    }

//    [Serializable]
//    public class ObjectStringLocalizedTextGroup : LocalizedTextGroup
//    {
//        private readonly string _key;
//        private readonly string _fieldName;

//        public ObjectStringLocalizedTextGroup(string key, string fieldName)
//        {
//            if (key == null)
//                throw new ArgumentNullException("key");
//            if (fieldName == null)
//                throw new ArgumentNullException("fieldName");
            
//            _key = key;
//            _fieldName = fieldName;

//            Add(new ObjectStringLocalizedTextEntry(GameContext.Current.TechDatabase[key].TextDatabaseEntry, _fieldName));

//            var rows = from o in ResourceManager.Database.ObjectStrings
//                       where (o.Key == _key) && (o.Culture != GameContext.Current.TechDatabase[key].TextDatabaseEntry.Culture)
//                       select new ObjectStringLocalizedTextEntry(o, _fieldName);

//            foreach (var row in rows)
//                Add(row);
//        }

//        public override LocalizedTextEntry CreateNew(CultureInfo culture)
//        {
//            ObjectString objectString = ResourceManager.Database.FindOrCreateObjectString(_key, culture.Name);
//            LocalizedTextEntry entry = new ObjectStringLocalizedTextEntry(objectString, _fieldName);
//            Add(entry);
//            return entry;
//        }
//    }

//    [Serializable]
//    public class ObjectStringLocalizedTextEntry : LocalizedTextEntry    
//    {
//        private readonly ObjectString _objectString;
//        private readonly string _fieldName;
//        private readonly StateScope _suppressPropertyChangedScope;

//        public ObjectStringLocalizedTextEntry(ObjectString objectString, string fieldName)
//        {
//            if (objectString == null)
//                throw new ArgumentNullException("objectString");
//            if (fieldName == null)
//                throw new ArgumentNullException("fieldName");
            
//            _objectString = objectString;
//            _fieldName = fieldName;
//            _suppressPropertyChangedScope = new StateScope();

//            _objectString.PropertyChanged += OnObjectStringPropertyChanged;
//        }

//        private void OnObjectStringPropertyChanged(object sender, PropertyChangedEventArgs e)
//        {
//            if (sender == _objectString)
//            {
//                try
//                {
//                    if (!_suppressPropertyChangedScope.IsWithin)
//                    {
//                        using (_suppressPropertyChangedScope.Enter())
//                        {
//                            OnValueChanged(_objectString.Key);
//                        }
//                    }
//                }
//                catch { }
//            }
//        }

//        protected internal override void OnRemoved(LocalizedTextGroup group)
//        {
//            string key = _objectString.Key;
//            //ResourceManager.Database.ObjectStrings.DeleteOnSubmit(_objectString);
//            //ResourceManager.Database.SubmitChanges();
//            OnValueChanged(key);
//        }

//        private void OnValueChanged(string key)
//        {
//            OnPropertyChanged("ValueInternal");
//            OnPropertyChanged("Value");
//            if (GameContext.Current != null)
//            {
//                try
//                {
//                    TechObjectDesign design = GameContext.Current.TechDatabase[key];
//                    string propertyName = _fieldName;
//                    if (design is OrbitalDesign)
//                    {
//                        switch (_fieldName)
//                        {
//                            case "Custom1":
//                                propertyName = "PrimaryWeaponName";
//                                break;
//                            case "Custom2":
//                                propertyName = "SecondaryWeaponName";
//                                break;
//                        }
//                    }
//                    design.OnPropertyChanged(propertyName);
//                }
//                catch {}
//            }
//        }

//        protected internal override void OnDisposed()
//        {
//            _objectString.PropertyChanged -= OnObjectStringPropertyChanged;
//        }

//        public ObjectString ObjectString
//        {
//            get { return _objectString; }
//        }

//        public string FieldName
//        {
//            get { return _fieldName; }
//        }

//        protected override string CultureInternal
//        {
//            get { return _objectString.Culture; }
//            set { _objectString.Culture = value; }
//        }

//        protected override string ValueInternal
//        {
//            get { return TypeDescriptor.GetProperties(_objectString)[_fieldName].GetValue(_objectString) as string ?? String.Empty; }
//            set { TypeDescriptor.GetProperties(_objectString)[_fieldName].SetValue(_objectString, value ?? String.Empty); }
//        }
//    }
//}
